// vite.config.ts
import { defineConfig, loadEnv } from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/vite@4.1.3_@types+node@18.14.0_less@4.1.3_terser@5.26.0/node_modules/vite/dist/node/index.js";
import vue from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/@vitejs+plugin-vue@4.0.0_vite@4.1.3_vue@3.2.47/node_modules/@vitejs/plugin-vue/dist/index.mjs";
import { resolve } from "path";
import VueSetupExtend from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/vite-plugin-vue-setup-extend@0.4.0_vite@4.1.3/node_modules/vite-plugin-vue-setup-extend/dist/index.mjs";
import vueJsx from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/@vitejs+plugin-vue-jsx@3.1.0_vite@4.1.3_vue@3.2.47/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs";
import AutoImport from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/unplugin-auto-import@0.16.7_@vueuse+core@10.7.1/node_modules/unplugin-auto-import/dist/vite.js";
import Components from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/unplugin-vue-components@0.25.2_vue@3.2.47/node_modules/unplugin-vue-components/dist/vite.mjs";
import { AntDesignVueResolver } from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/unplugin-vue-components@0.25.2_vue@3.2.47/node_modules/unplugin-vue-components/dist/resolvers.mjs";
import checker from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/vite-plugin-checker@0.6.2_typescript@4.9.5_vite@4.1.3_vue-tsc@1.1.5/node_modules/vite-plugin-checker/dist/esm/main.js";
import svgLoader from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/vite-svg-loader@5.1.0_vue@3.2.47/node_modules/vite-svg-loader/index.js";

// src/plugins/svgBuilder.js
import { readFileSync, readdirSync } from "fs";
var idPerfix = "";
var svgTitle = /<svg([^>+].*?)>/;
var clearHeightWidth = /(width|height)="([^>+].*?)"/g;
var hasViewBox = /(viewBox="[^>+].*?")/g;
var clearReturn = /(\r)|(\n)/g;
function findSvgFile(dir) {
  var _a2, _b2, _c2;
  const svgRes = [];
  const dirents = readdirSync(dir, {
    withFileTypes: true
  });
  for (const dirent of dirents) {
    if (dirent.isDirectory()) {
      svgRes.push(...findSvgFile(dir + dirent.name + "/"));
    } else {
      const svg = (_c2 = (_b2 = (_a2 = readFileSync(dir + dirent.name).toString()) == null ? void 0 : _a2.replace(clearReturn, "")) == null ? void 0 : _b2.replace(svgTitle, ($1, $2) => {
        var _a3;
        let width = 0;
        let height = 0;
        let content = $2 == null ? void 0 : $2.replace(clearHeightWidth, (s1, s2, s3) => {
          if (s2 === "width") {
            width = s3;
          } else if (s2 === "height") {
            height = s3;
          }
          return "";
        });
        if (!hasViewBox.test($2)) {
          content += `viewBox="0 0 ${width} ${height}"`;
        }
        return `<symbol id="${idPerfix}-${(_a3 = dirent.name) == null ? void 0 : _a3.replace(
          ".svg",
          ""
        )}" ${content}>`;
      })) == null ? void 0 : _c2.replace("</svg>", "</symbol>");
      svgRes.push(svg);
    }
  }
  return svgRes;
}
var svgBuilder = (path, perfix = "icon") => {
  if (path === "")
    return;
  idPerfix = perfix;
  const res = findSvgFile(path);
  return {
    name: "svg-transform",
    transformIndexHtml(html) {
      return html == null ? void 0 : html.replace(
        "<body>",
        `
          <body>
            <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0">
              ${res.join("")}
            </svg>
        `
      );
    }
  };
};

// src/utils/tools.ts
function formatFileSize(size, pointLength = 2) {
  if (size < 1024) {
    return size + "B";
  } else if (size < 1024 * 1024) {
    return (size / 1024).toFixed(pointLength) + "KB";
  } else {
    return (size / 1024 / 1024).toFixed(pointLength) + "MB";
  }
}

// src/plugins/tinifyImg.ts
import { readFile, stat } from "fs";
import { createHash } from "crypto";
import sharp from "file:///E:/%E6%9E%81%E5%85%89%E6%97%BB/im_backstage/node_modules/.pnpm/sharp@0.33.2/node_modules/sharp/lib/index.js";
var hashConnect = "-";
var hashLength = 8;
var isNeedHash = true;
var assetsInlineLimit = 4096;
var imgFileMap = {};
var imageRegex = /\.(png|jpe?g|gif|webp)$/i;
function generateHash(content) {
  return createHash("sha256").update(content).digest("hex");
}
function getFileExt(filePath) {
  return filePath.split(".").pop();
}
function getFileName(filePath) {
  return filePath.split("/").pop();
}
function generateHashFileName(filePath, isConnectHash, hashLen, hash) {
  const fileName = getFileName(filePath);
  const ext = getFileExt(fileName);
  return isConnectHash ? `${fileName.replace(`.${ext}`, "")}${hashConnect}${hash.slice(
    0,
    hashLen
  )}.${ext}` : `${fileName.replace(`.${ext}`, "")}.${ext}`;
}
function getFileSize(filePath) {
  return new Promise((resolve2) => {
    stat(filePath, (err, stats) => {
      if (err)
        resolve2(void 0);
      resolve2(stats.size);
    });
  });
}
function readFileContent(filePath) {
  return new Promise((resolve2) => {
    readFile(filePath, (err, data) => {
      if (err)
        resolve2(void 0);
      resolve2(data);
    });
  });
}
function formatterLog(filePath, sizeBefore, sizeAfter) {
  console.log(
    "\n\x1B[34m",
    `\u3010${filePath}\u3011\u538B\u7F29\u6210\u529F`,
    "\x1B[0m",
    "\x1B[31m",
    sizeBefore,
    "\x1B[0m",
    "===>",
    "\x1B[32m",
    sizeAfter,
    "\x1B[0m"
  );
}
function tinifyImg(imgFile) {
  const { size, url: filePath } = imgFile;
  const ext = getFileExt(filePath);
  return new Promise((resolve2) => {
    switch (ext) {
      case "png":
        sharp(filePath, { limitInputPixels: false }).png({ quality: 10 }).toBuffer((err, data, info) => {
          if (err) {
            console.log(`
\x1B[31m\u3010${filePath}\u3011\u538B\u7F29\u5931\u8D25\x1B[0m`, err);
            resolve2(void 0);
          } else {
            formatterLog(filePath, size, formatFileSize(info.size));
            resolve2(data);
          }
        });
        break;
      case "jpeg":
        sharp(filePath, { limitInputPixels: false }).jpeg({ quality: 10 }).toBuffer((err, data, info) => {
          if (err) {
            console.log(`
\x1B[31m\u3010${filePath}\u3011\u538B\u7F29\u5931\u8D25\x1B[0m`, err);
            resolve2(void 0);
          } else {
            formatterLog(filePath, size, formatFileSize(info.size));
            resolve2(data);
          }
        });
        break;
      case "gif":
        sharp(filePath, { animated: true, limitInputPixels: false }).gif({ interFrameMaxError: 10, colours: 200 }).toBuffer((err, data, info) => {
          if (err) {
            console.log(`
\x1B[31m\u3010${filePath}\u3011\u538B\u7F29\u5931\u8D25\x1B[0m`, err);
            resolve2(void 0);
          } else {
            formatterLog(filePath, size, formatFileSize(info.size));
            resolve2(data);
          }
        });
        break;
      case "webp":
        sharp(filePath, { limitInputPixels: false }).webp({ quality: 10 }).toBuffer((err, data, info) => {
          if (err) {
            console.log(`
\x1B[31m\u3010${filePath}\u3011\u538B\u7F29\u5931\u8D25\x1B[0m`, err);
            resolve2(void 0);
          } else {
            formatterLog(filePath, size, formatFileSize(info.size));
            resolve2(data);
          }
        });
        break;
      default:
        resolve2(void 0);
    }
  });
}
var tinifyImg_default = () => {
  return {
    name: "vite-plugin-tinify-image",
    enforce: "pre",
    // 在其他插件处理之前，先处理
    apply: "build",
    // 只在生产环境构建时启用
    async configResolved(config) {
      var _a2, _b2, _c2;
      assetsInlineLimit = config.build.assetsInlineLimit;
      const assetFileNames = (_c2 = (_b2 = (_a2 = config == null ? void 0 : config.build) == null ? void 0 : _a2.rollupOptions) == null ? void 0 : _b2.output) == null ? void 0 : _c2.assetFileNames;
      if (assetFileNames) {
        if (/\[hash:?(\d*)\]/.test(assetFileNames)) {
          hashConnect = "";
          assetFileNames.replace(
            /\[name\](.)\[hash:?(\d*)\]/,
            (match, $1, $2) => {
              hashConnect = $1;
              hashLength = Number($2) || 8;
              return "";
            }
          );
        } else {
          isNeedHash = false;
          hashConnect = "";
        }
      } else {
        hashConnect = "-";
      }
    },
    async load(id) {
      if (imageRegex.test(id)) {
        const size = await getFileSize(id);
        if (size && size > assetsInlineLimit) {
          const res = await readFileContent(id);
          if (res) {
            imgFileMap[generateHashFileName(
              id,
              isNeedHash,
              hashLength,
              generateHash(res)
            )] = {
              size: formatFileSize(size),
              url: id
            };
          }
        }
      }
    },
    async generateBundle(_options, bundle) {
      console.log("\n===============\u5F00\u59CB\u56FE\u7247\u538B\u7F29==============");
      for (const key in bundle) {
        if (imageRegex.test(key)) {
          const fileName = getFileName(key);
          if (fileName && imgFileMap[fileName]) {
            const res = await tinifyImg(imgFileMap[fileName]);
            if (res) {
              bundle[key].source = res;
            }
          }
        }
      }
      console.log("\n===============\u5B8C\u6210\u56FE\u7247\u538B\u7F29==============");
    }
  };
};

// src/config/proxyAddress.txt?raw
var proxyAddress_default = "https://maps.googleapis.com";

// src/config/system.ts
var getNowDate = () => {
  var date = new Date();
  var sign2 = ":";
  var year = date.getFullYear();
  var month = date.getMonth() + 1;
  var day = date.getDate();
  var hour = date.getHours();
  var minutes = date.getMinutes();
  var seconds = date.getSeconds();
  var weekArr = [
    "\u661F\u671F\u5929",
    "\u661F\u671F\u4E00",
    "\u661F\u671F\u4E8C",
    "\u661F\u671F\u4E09",
    "\u661F\u671F\u56DB",
    "\u661F\u671F\u4E94",
    "\u661F\u671F\u516D"
  ];
  var week = weekArr[date.getDay()];
  if (month >= 1 && month <= 9)
    month = "0" + month;
  if (day >= 0 && day <= 9)
    day = "0" + day;
  if (hour >= 0 && hour <= 9)
    hour = "0" + hour;
  if (minutes >= 0 && minutes <= 9)
    minutes = "0" + minutes;
  if (seconds >= 0 && seconds <= 9)
    seconds = "0" + seconds;
  return year + "-" + month + "-" + day + " " + hour + sign2 + minutes + sign2 + seconds + " " + week;
};

// vite.config.ts
var __vite_injected_original_dirname = "E:\\\u6781\u5149\u65FB\\im_backstage";
var _a, _b, _c;
var proxyAddressArr = (_c = (_b = (_a = proxyAddress_default) == null ? void 0 : _a.split) == null ? void 0 : _b.call(_a, "\r\n")) == null ? void 0 : _c.map((url) => url.trim());
var vite_config_default = defineConfig(async ({ command, mode }) => {
  var _a2;
  const config = loadEnv(mode, process.cwd());
  const environment = config.VITE_ENV;
  const isProduction = environment !== "development.dev";
  const proxy_address = (env, url = "") => {
    switch (env) {
      case "development.dev":
        return url || config.VITE_URL;
      case "development.test":
        return url || config.VITE_URL;
      case "development.prod":
        return url || config.VITE_URL;
    }
  };
  const getPort = (env) => {
    switch (env) {
      case "development.dev":
        return 3001;
      case "development.test":
        return 3003;
      case "development.prod":
        return 3005;
    }
  };
  const port = getPort(environment);
  console.log("\u7CFB\u7EDF\u66F4\u65B0\u65F6\u95F4", getNowDate());
  return {
    define: {
      __APP_VERSION__: JSON.stringify("v1.2.5"),
      __APP_BRANCH__: JSON.stringify((_a2 = mode == null ? void 0 : mode.split) == null ? void 0 : _a2.call(mode, ".")[1]),
      __APP_UPDATE_TIME__: JSON.stringify(getNowDate())
    },
    envPrefix: "VITE_",
    base: environment === "development.dev" ? "/" : "/",
    productionSourceMap: !isProduction,
    build: {
      outDir: "dist",
      assetsDir: "assets",
      sourcemap: false,
      minify: "terser",
      chunkSizeWarningLimit: 1024 * 10,
      terserOptions: {
        output: {
          comments: true
        },
        compress: {
          drop_console: true,
          drop_debugger: true
        }
      },
      rollupOptions: {
        output: {
          // 静态资源分类打包
          chunkFileNames: "assets/js/[name]-[hash].js",
          entryFileNames: "assets/js/[name]-[hash].js",
          assetFileNames: "assets/[ext]/[name]-[hash].[ext]",
          manualChunks: (id) => {
            if (id.includes("node_modules")) {
              if (id.includes("ant-design-vue"))
                return "ant-dsign-vue";
              if (id.includes("@ant-design/icons-vue"))
                return "@ant-design/icons-vue";
              if (id.includes("echarts"))
                return "echarts";
              if (id.includes("lodash"))
                return "lodash";
              if (id.includes("moment-timezone"))
                return "moment-timezone";
              if (id.includes("axios"))
                return "axios";
              if (id.includes("dayjs"))
                return "dayjs";
              if (id.includes("pinia"))
                return "pinia";
              if (id.includes("vod-js-sdk-v6"))
                return "vod-js-sdk-v6";
            }
          }
        }
      }
    },
    server: {
      https: false,
      open: false,
      cors: true,
      port,
      host: "0.0.0.0",
      proxy: {
        "/maps/api": {
          target: proxyAddressArr[0],
          changeOrigin: true,
          rewrite: (path) => {
            var _a3;
            return (_a3 = path == null ? void 0 : path.replace) == null ? void 0 : _a3.call(path, /^\/maps\/api/, "/maps/api");
          }
        },
        "/api": {
          target: proxy_address(environment),
          changeOrigin: true,
          rewrite: (path) => {
            var _a3;
            return (_a3 = path == null ? void 0 : path.replace) == null ? void 0 : _a3.call(path, /^\/api/, "");
          }
        }
      }
    },
    css: {
      preprocessorOptions: {
        less: {
          modifyVars: {
            hack: `true; @import (reference) "${resolve(
              "src/assets/less/base.less"
            )}";`
          },
          javascriptEnabled: true
        }
      }
    },
    resolve: {
      alias: {
        "@views": resolve(__vite_injected_original_dirname, "src/views"),
        "~/": `${resolve(__vite_injected_original_dirname, "src")}/`,
        "@": resolve(__vite_injected_original_dirname, "src"),
        "@assets": resolve(__vite_injected_original_dirname, "src/assets"),
        "@components": resolve(__vite_injected_original_dirname, "src/components"),
        "@images": resolve(__vite_injected_original_dirname, "src/assets/images"),
        "@store": resolve(__vite_injected_original_dirname, "src/store")
      }
    },
    plugins: [
      vue(),
      svgLoader(),
      vueJsx(),
      VueSetupExtend(),
      // 自动导入api
      AutoImport({
        imports: [
          "vue",
          "vue-router",
          "pinia",
          {
            vue: ["createVNode", "defineExpose", "withModifiers"],
            "ant-design-vue": ["message", "Modal", "notification"]
          }
        ],
        include: [/\.[tj]sx?$/, /\.vue$/, /\.vue\?vue/],
        eslintrc: {
          enabled: false,
          filepath: "./.eslintrc-auto-import.json",
          globalsPropValue: true
        },
        vueTemplate: true,
        dirs: [
          "./src/api",
          "./src/config",
          "./src/store",
          "./src/assets/types",
          "./src/assets/validate",
          "./src/assets/js",
          "./src/assets/hoc"
        ],
        dts: "./src/types/auto-imports.d.ts",
        resolvers: [AntDesignVueResolver()]
      }),
      // 自动导入组件
      Components({
        dts: "./src/types/components.d.ts",
        dirs: [],
        extensions: ["vue", "jsx", "tsx", "ts", "js"],
        // 按需导入组件配置只在模版语法中生效
        resolvers: [
          AntDesignVueResolver({ importStyle: true, resolveIcons: true })
        ]
      }),
      svgBuilder("./src/assets/icons/ali-svg/"),
      tinifyImg_default(),
      checker({
        vueTsc: true
      })
    ]
  };
});
export {
  vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAic3JjL3BsdWdpbnMvc3ZnQnVpbGRlci5qcyIsICJzcmMvdXRpbHMvdG9vbHMudHMiLCAic3JjL3BsdWdpbnMvdGluaWZ5SW1nLnRzIiwgInNyYy9jb25maWcvc3lzdGVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcXHU2NzgxXHU1MTQ5XHU2NUZCXFxcXGltX2JhY2tzdGFnZVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcXHU2NzgxXHU1MTQ5XHU2NUZCXFxcXGltX2JhY2tzdGFnZVxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovJUU2JTlFJTgxJUU1JTg1JTg5JUU2JTk3JUJCL2ltX2JhY2tzdGFnZS92aXRlLmNvbmZpZy50c1wiO2ltcG9ydCB7IGRlZmluZUNvbmZpZywgbG9hZEVudiB9IGZyb20gXCJ2aXRlXCI7XHJcbmltcG9ydCB2dWUgZnJvbSBcIkB2aXRlanMvcGx1Z2luLXZ1ZVwiO1xyXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcclxuaW1wb3J0IFZ1ZVNldHVwRXh0ZW5kIGZyb20gXCJ2aXRlLXBsdWdpbi12dWUtc2V0dXAtZXh0ZW5kXCI7XHJcbmltcG9ydCB2dWVKc3ggZnJvbSBcIkB2aXRlanMvcGx1Z2luLXZ1ZS1qc3hcIjtcclxuaW1wb3J0IEF1dG9JbXBvcnQgZnJvbSBcInVucGx1Z2luLWF1dG8taW1wb3J0L3ZpdGVcIjtcclxuaW1wb3J0IENvbXBvbmVudHMgZnJvbSBcInVucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3ZpdGVcIjtcclxuaW1wb3J0IHsgQW50RGVzaWduVnVlUmVzb2x2ZXIgfSBmcm9tIFwidW5wbHVnaW4tdnVlLWNvbXBvbmVudHMvcmVzb2x2ZXJzXCI7XHJcbmltcG9ydCBjaGVja2VyIGZyb20gXCJ2aXRlLXBsdWdpbi1jaGVja2VyXCI7XHJcbmltcG9ydCBzdmdMb2FkZXIgZnJvbSBcInZpdGUtc3ZnLWxvYWRlclwiO1xyXG5pbXBvcnQgeyBzdmdCdWlsZGVyIH0gZnJvbSBcIi4vc3JjL3BsdWdpbnMvc3ZnQnVpbGRlci5qc1wiO1xyXG4vLyBAdHMtaWdub3JlXHJcbmltcG9ydCB0aW5pZnlJbWcgZnJvbSBcIi4vc3JjL3BsdWdpbnMvdGluaWZ5SW1nLnRzXCI7XHJcbi8vIEB0cy1pZ25vcmVcclxuaW1wb3J0IHByb3h5QWRkcmVzcyBmcm9tIFwiLi9zcmMvY29uZmlnL3Byb3h5QWRkcmVzcy50eHQ/cmF3XCI7XHJcbi8vIEB0cy1pZ25vcmVcclxuaW1wb3J0IHsgZ2V0Tm93RGF0ZSB9IGZyb20gXCIuL3NyYy9jb25maWcvc3lzdGVtLnRzXCI7XHJcbmNvbnN0IHByb3h5QWRkcmVzc0FyciA9IHByb3h5QWRkcmVzcz8uc3BsaXQ/LihcIlxcclxcblwiKT8ubWFwKCh1cmwpID0+IHVybC50cmltKCkpO1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoYXN5bmMgKHsgY29tbWFuZCwgbW9kZSB9KSA9PiB7XHJcbiAgY29uc3QgY29uZmlnID0gbG9hZEVudihtb2RlLCBwcm9jZXNzLmN3ZCgpKTtcclxuICBjb25zdCBlbnZpcm9ubWVudCA9IGNvbmZpZy5WSVRFX0VOVjtcclxuICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBlbnZpcm9ubWVudCAhPT0gXCJkZXZlbG9wbWVudC5kZXZcIjtcclxuICBjb25zdCBwcm94eV9hZGRyZXNzOiBhbnkgPSAoZW52LCB1cmwgPSBcIlwiKSA9PiB7XHJcbiAgICBzd2l0Y2ggKGVudikge1xyXG4gICAgICBjYXNlIFwiZGV2ZWxvcG1lbnQuZGV2XCI6XHJcbiAgICAgICAgcmV0dXJuIHVybCB8fCBjb25maWcuVklURV9VUkw7XHJcbiAgICAgIGNhc2UgXCJkZXZlbG9wbWVudC50ZXN0XCI6XHJcbiAgICAgICAgcmV0dXJuIHVybCB8fCBjb25maWcuVklURV9VUkw7XHJcbiAgICAgIGNhc2UgXCJkZXZlbG9wbWVudC5wcm9kXCI6XHJcbiAgICAgICAgcmV0dXJuIHVybCB8fCBjb25maWcuVklURV9VUkw7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBnZXRQb3J0OiBhbnkgPSAoZW52KSA9PiB7XHJcbiAgICBzd2l0Y2ggKGVudikge1xyXG4gICAgICBjYXNlIFwiZGV2ZWxvcG1lbnQuZGV2XCI6XHJcbiAgICAgICAgcmV0dXJuIDMwMDE7XHJcbiAgICAgIGNhc2UgXCJkZXZlbG9wbWVudC50ZXN0XCI6XHJcbiAgICAgICAgcmV0dXJuIDMwMDM7XHJcbiAgICAgIGNhc2UgXCJkZXZlbG9wbWVudC5wcm9kXCI6XHJcbiAgICAgICAgcmV0dXJuIDMwMDU7XHJcbiAgICB9XHJcbiAgfTtcclxuICBjb25zdCBwb3J0ID0gZ2V0UG9ydChlbnZpcm9ubWVudCk7XHJcbiAgLy8gXHU2ODNDXHU1RjBGXHU1MzE2XHU2NUU1XHU1QkY5XHU4QzYxXHJcbiAgY29uc29sZS5sb2coXCJcdTdDRkJcdTdFREZcdTY2RjRcdTY1QjBcdTY1RjZcdTk1RjRcIiwgZ2V0Tm93RGF0ZSgpKTtcclxuICByZXR1cm4ge1xyXG4gICAgZGVmaW5lOiB7XHJcbiAgICAgIF9fQVBQX1ZFUlNJT05fXzogSlNPTi5zdHJpbmdpZnkoXCJ2MS4yLjVcIiksXHJcbiAgICAgIF9fQVBQX0JSQU5DSF9fOiBKU09OLnN0cmluZ2lmeShtb2RlPy5zcGxpdD8uKFwiLlwiKVsxXSksXHJcbiAgICAgIF9fQVBQX1VQREFURV9USU1FX186IEpTT04uc3RyaW5naWZ5KGdldE5vd0RhdGUoKSksXHJcbiAgICB9LFxyXG4gICAgZW52UHJlZml4OiBcIlZJVEVfXCIsXHJcbiAgICBiYXNlOiBlbnZpcm9ubWVudCA9PT0gXCJkZXZlbG9wbWVudC5kZXZcIiA/IFwiL1wiIDogXCIvXCIsXHJcbiAgICBwcm9kdWN0aW9uU291cmNlTWFwOiAhaXNQcm9kdWN0aW9uLFxyXG4gICAgYnVpbGQ6IHtcclxuICAgICAgb3V0RGlyOiBcImRpc3RcIixcclxuICAgICAgYXNzZXRzRGlyOiBcImFzc2V0c1wiLFxyXG4gICAgICBzb3VyY2VtYXA6IGZhbHNlLFxyXG4gICAgICBtaW5pZnk6IFwidGVyc2VyXCIsXHJcbiAgICAgIGNodW5rU2l6ZVdhcm5pbmdMaW1pdDogMTAyNCAqIDEwLFxyXG4gICAgICB0ZXJzZXJPcHRpb25zOiB7XHJcbiAgICAgICAgb3V0cHV0OiB7XHJcbiAgICAgICAgICBjb21tZW50czogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXByZXNzOiB7XHJcbiAgICAgICAgICBkcm9wX2NvbnNvbGU6IHRydWUsXHJcbiAgICAgICAgICBkcm9wX2RlYnVnZ2VyOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIHJvbGx1cE9wdGlvbnM6IHtcclxuICAgICAgICBvdXRwdXQ6IHtcclxuICAgICAgICAgIC8vIFx1OTc1OVx1NjAwMVx1OEQ0NFx1NkU5MFx1NTIwNlx1N0M3Qlx1NjI1M1x1NTMwNVxyXG4gICAgICAgICAgY2h1bmtGaWxlTmFtZXM6IFwiYXNzZXRzL2pzL1tuYW1lXS1baGFzaF0uanNcIixcclxuICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiBcImFzc2V0cy9qcy9bbmFtZV0tW2hhc2hdLmpzXCIsXHJcbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogXCJhc3NldHMvW2V4dF0vW25hbWVdLVtoYXNoXS5bZXh0XVwiLFxyXG4gICAgICAgICAgbWFudWFsQ2h1bmtzOiAoaWQpID0+IHtcclxuICAgICAgICAgICAgLy8gXHU2QkQ0XHU4RjgzXHU1OTI3XHU3Njg0XHU4RDQ0XHU2RTkwXHU4RkRCXHU4ODRDXHU1MjA2XHU1MzA1XHJcbiAgICAgICAgICAgIGlmIChpZC5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKSkge1xyXG4gICAgICAgICAgICAgIGlmIChpZC5pbmNsdWRlcyhcImFudC1kZXNpZ24tdnVlXCIpKSByZXR1cm4gXCJhbnQtZHNpZ24tdnVlXCI7XHJcbiAgICAgICAgICAgICAgaWYgKGlkLmluY2x1ZGVzKFwiQGFudC1kZXNpZ24vaWNvbnMtdnVlXCIpKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiQGFudC1kZXNpZ24vaWNvbnMtdnVlXCI7XHJcbiAgICAgICAgICAgICAgaWYgKGlkLmluY2x1ZGVzKFwiZWNoYXJ0c1wiKSkgcmV0dXJuIFwiZWNoYXJ0c1wiO1xyXG4gICAgICAgICAgICAgIGlmIChpZC5pbmNsdWRlcyhcImxvZGFzaFwiKSkgcmV0dXJuIFwibG9kYXNoXCI7XHJcbiAgICAgICAgICAgICAgaWYgKGlkLmluY2x1ZGVzKFwibW9tZW50LXRpbWV6b25lXCIpKSByZXR1cm4gXCJtb21lbnQtdGltZXpvbmVcIjtcclxuICAgICAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoXCJheGlvc1wiKSkgcmV0dXJuIFwiYXhpb3NcIjtcclxuICAgICAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoXCJkYXlqc1wiKSkgcmV0dXJuIFwiZGF5anNcIjtcclxuICAgICAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoXCJwaW5pYVwiKSkgcmV0dXJuIFwicGluaWFcIjtcclxuICAgICAgICAgICAgICBpZiAoaWQuaW5jbHVkZXMoXCJ2b2QtanMtc2RrLXY2XCIpKSByZXR1cm4gXCJ2b2QtanMtc2RrLXY2XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBzZXJ2ZXI6IHtcclxuICAgICAgaHR0cHM6IGZhbHNlLFxyXG4gICAgICBvcGVuOiBmYWxzZSxcclxuICAgICAgY29yczogdHJ1ZSxcclxuICAgICAgcG9ydDogcG9ydCxcclxuICAgICAgaG9zdDogXCIwLjAuMC4wXCIsXHJcbiAgICAgIHByb3h5OiB7XHJcbiAgICAgICAgXCIvbWFwcy9hcGlcIjoge1xyXG4gICAgICAgICAgdGFyZ2V0OiBwcm94eUFkZHJlc3NBcnJbMF0sXHJcbiAgICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aD8ucmVwbGFjZT8uKC9eXFwvbWFwc1xcL2FwaS8sIFwiL21hcHMvYXBpXCIpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCIvYXBpXCI6IHtcclxuICAgICAgICAgIHRhcmdldDogcHJveHlfYWRkcmVzcyhlbnZpcm9ubWVudCksXHJcbiAgICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aD8ucmVwbGFjZT8uKC9eXFwvYXBpLywgXCJcIiksXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBjc3M6IHtcclxuICAgICAgcHJlcHJvY2Vzc29yT3B0aW9uczoge1xyXG4gICAgICAgIGxlc3M6IHtcclxuICAgICAgICAgIG1vZGlmeVZhcnM6IHtcclxuICAgICAgICAgICAgaGFjazogYHRydWU7IEBpbXBvcnQgKHJlZmVyZW5jZSkgXCIke3Jlc29sdmUoXHJcbiAgICAgICAgICAgICAgXCJzcmMvYXNzZXRzL2xlc3MvYmFzZS5sZXNzXCJcclxuICAgICAgICAgICAgKX1cIjtgLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGphdmFzY3JpcHRFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgcmVzb2x2ZToge1xyXG4gICAgICBhbGlhczoge1xyXG4gICAgICAgIFwiQHZpZXdzXCI6IHJlc29sdmUoX19kaXJuYW1lLCBcInNyYy92aWV3c1wiKSxcclxuICAgICAgICBcIn4vXCI6IGAke3Jlc29sdmUoX19kaXJuYW1lLCBcInNyY1wiKX0vYCxcclxuICAgICAgICBcIkBcIjogcmVzb2x2ZShfX2Rpcm5hbWUsIFwic3JjXCIpLFxyXG4gICAgICAgIFwiQGFzc2V0c1wiOiByZXNvbHZlKF9fZGlybmFtZSwgXCJzcmMvYXNzZXRzXCIpLFxyXG4gICAgICAgIFwiQGNvbXBvbmVudHNcIjogcmVzb2x2ZShfX2Rpcm5hbWUsIFwic3JjL2NvbXBvbmVudHNcIiksXHJcbiAgICAgICAgXCJAaW1hZ2VzXCI6IHJlc29sdmUoX19kaXJuYW1lLCBcInNyYy9hc3NldHMvaW1hZ2VzXCIpLFxyXG4gICAgICAgIFwiQHN0b3JlXCI6IHJlc29sdmUoX19kaXJuYW1lLCBcInNyYy9zdG9yZVwiKSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBwbHVnaW5zOiBbXHJcbiAgICAgIHZ1ZSgpLFxyXG4gICAgICBzdmdMb2FkZXIoKSxcclxuICAgICAgdnVlSnN4KCksXHJcbiAgICAgIFZ1ZVNldHVwRXh0ZW5kKCksXHJcbiAgICAgIC8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NWFwaVxyXG4gICAgICBBdXRvSW1wb3J0KHtcclxuICAgICAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgICBcInZ1ZVwiLFxyXG4gICAgICAgICAgXCJ2dWUtcm91dGVyXCIsXHJcbiAgICAgICAgICBcInBpbmlhXCIsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHZ1ZTogW1wiY3JlYXRlVk5vZGVcIiwgXCJkZWZpbmVFeHBvc2VcIiwgXCJ3aXRoTW9kaWZpZXJzXCJdLFxyXG4gICAgICAgICAgICBcImFudC1kZXNpZ24tdnVlXCI6IFtcIm1lc3NhZ2VcIiwgXCJNb2RhbFwiLCBcIm5vdGlmaWNhdGlvblwiXSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBpbmNsdWRlOiBbL1xcLlt0al1zeD8kLywgL1xcLnZ1ZSQvLCAvXFwudnVlXFw/dnVlL10sXHJcbiAgICAgICAgZXNsaW50cmM6IHtcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgZmlsZXBhdGg6IFwiLi8uZXNsaW50cmMtYXV0by1pbXBvcnQuanNvblwiLFxyXG4gICAgICAgICAgZ2xvYmFsc1Byb3BWYWx1ZTogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZ1ZVRlbXBsYXRlOiB0cnVlLFxyXG4gICAgICAgIGRpcnM6IFtcclxuICAgICAgICAgIFwiLi9zcmMvYXBpXCIsXHJcbiAgICAgICAgICBcIi4vc3JjL2NvbmZpZ1wiLFxyXG4gICAgICAgICAgXCIuL3NyYy9zdG9yZVwiLFxyXG4gICAgICAgICAgXCIuL3NyYy9hc3NldHMvdHlwZXNcIixcclxuICAgICAgICAgIFwiLi9zcmMvYXNzZXRzL3ZhbGlkYXRlXCIsXHJcbiAgICAgICAgICBcIi4vc3JjL2Fzc2V0cy9qc1wiLFxyXG4gICAgICAgICAgXCIuL3NyYy9hc3NldHMvaG9jXCIsXHJcbiAgICAgICAgXSxcclxuICAgICAgICBkdHM6IFwiLi9zcmMvdHlwZXMvYXV0by1pbXBvcnRzLmQudHNcIixcclxuICAgICAgICByZXNvbHZlcnM6IFtBbnREZXNpZ25WdWVSZXNvbHZlcigpXSxcclxuICAgICAgfSksXHJcbiAgICAgIC8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NVx1N0VDNFx1NEVGNlxyXG4gICAgICBDb21wb25lbnRzKHtcclxuICAgICAgICBkdHM6IFwiLi9zcmMvdHlwZXMvY29tcG9uZW50cy5kLnRzXCIsXHJcbiAgICAgICAgZGlyczogW10sXHJcbiAgICAgICAgZXh0ZW5zaW9uczogW1widnVlXCIsIFwianN4XCIsIFwidHN4XCIsIFwidHNcIiwgXCJqc1wiXSxcclxuICAgICAgICAvLyBcdTYzMDlcdTk3MDBcdTVCRkNcdTUxNjVcdTdFQzRcdTRFRjZcdTkxNERcdTdGNkVcdTUzRUFcdTU3MjhcdTZBMjFcdTcyNDhcdThCRURcdTZDRDVcdTRFMkRcdTc1MUZcdTY1NDhcclxuICAgICAgICByZXNvbHZlcnM6IFtcclxuICAgICAgICAgIEFudERlc2lnblZ1ZVJlc29sdmVyKHsgaW1wb3J0U3R5bGU6IHRydWUsIHJlc29sdmVJY29uczogdHJ1ZSB9KSxcclxuICAgICAgICBdLFxyXG4gICAgICB9KSxcclxuICAgICAgc3ZnQnVpbGRlcihcIi4vc3JjL2Fzc2V0cy9pY29ucy9hbGktc3ZnL1wiKSxcclxuICAgICAgdGluaWZ5SW1nKCksXHJcbiAgICAgIGNoZWNrZXIoe1xyXG4gICAgICAgIHZ1ZVRzYzogdHJ1ZSxcclxuICAgICAgfSksXHJcbiAgICBdLFxyXG4gIH07XHJcbn0pO1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFx1Njc4MVx1NTE0OVx1NjVGQlxcXFxpbV9iYWNrc3RhZ2VcXFxcc3JjXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFx1Njc4MVx1NTE0OVx1NjVGQlxcXFxpbV9iYWNrc3RhZ2VcXFxcc3JjXFxcXHBsdWdpbnNcXFxcc3ZnQnVpbGRlci5qc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovJUU2JTlFJTgxJUU1JTg1JTg5JUU2JTk3JUJCL2ltX2JhY2tzdGFnZS9zcmMvcGx1Z2lucy9zdmdCdWlsZGVyLmpzXCI7aW1wb3J0IHsgcmVhZEZpbGVTeW5jLCByZWFkZGlyU3luYyB9IGZyb20gXCJmc1wiO1xyXG5cclxubGV0IGlkUGVyZml4ID0gXCJcIjtcclxuY29uc3Qgc3ZnVGl0bGUgPSAvPHN2ZyhbXj4rXS4qPyk+LztcclxuY29uc3QgY2xlYXJIZWlnaHRXaWR0aCA9IC8od2lkdGh8aGVpZ2h0KT1cIihbXj4rXS4qPylcIi9nO1xyXG5cclxuY29uc3QgaGFzVmlld0JveCA9IC8odmlld0JveD1cIltePitdLio/XCIpL2c7XHJcblxyXG5jb25zdCBjbGVhclJldHVybiA9IC8oXFxyKXwoXFxuKS9nO1xyXG5cclxuZnVuY3Rpb24gZmluZFN2Z0ZpbGUoZGlyKSB7XHJcbiAgY29uc3Qgc3ZnUmVzID0gW107XHJcbiAgY29uc3QgZGlyZW50cyA9IHJlYWRkaXJTeW5jKGRpciwge1xyXG4gICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcclxuICB9KTtcclxuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XHJcbiAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcclxuICAgICAgc3ZnUmVzLnB1c2goLi4uZmluZFN2Z0ZpbGUoZGlyICsgZGlyZW50Lm5hbWUgKyBcIi9cIikpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgc3ZnID0gcmVhZEZpbGVTeW5jKGRpciArIGRpcmVudC5uYW1lKVxyXG4gICAgICAgIC50b1N0cmluZygpXHJcbiAgICAgICAgPy5yZXBsYWNlKGNsZWFyUmV0dXJuLCBcIlwiKVxyXG4gICAgICAgID8ucmVwbGFjZShzdmdUaXRsZSwgKCQxLCAkMikgPT4ge1xyXG4gICAgICAgICAgbGV0IHdpZHRoID0gMDtcclxuICAgICAgICAgIGxldCBoZWlnaHQgPSAwO1xyXG4gICAgICAgICAgbGV0IGNvbnRlbnQgPSAkMj8ucmVwbGFjZShjbGVhckhlaWdodFdpZHRoLCAoczEsIHMyLCBzMykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoczIgPT09IFwid2lkdGhcIikge1xyXG4gICAgICAgICAgICAgIHdpZHRoID0gczM7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoczIgPT09IFwiaGVpZ2h0XCIpIHtcclxuICAgICAgICAgICAgICBoZWlnaHQgPSBzMztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKCFoYXNWaWV3Qm94LnRlc3QoJDIpKSB7XHJcbiAgICAgICAgICAgIGNvbnRlbnQgKz0gYHZpZXdCb3g9XCIwIDAgJHt3aWR0aH0gJHtoZWlnaHR9XCJgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGA8c3ltYm9sIGlkPVwiJHtpZFBlcmZpeH0tJHtkaXJlbnQubmFtZT8ucmVwbGFjZShcclxuICAgICAgICAgICAgXCIuc3ZnXCIsXHJcbiAgICAgICAgICAgIFwiXCJcclxuICAgICAgICAgICl9XCIgJHtjb250ZW50fT5gO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgPy5yZXBsYWNlKFwiPC9zdmc+XCIsIFwiPC9zeW1ib2w+XCIpO1xyXG4gICAgICBzdmdSZXMucHVzaChzdmcpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gc3ZnUmVzO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc3ZnQnVpbGRlciA9IChwYXRoLCBwZXJmaXggPSBcImljb25cIikgPT4ge1xyXG4gIGlmIChwYXRoID09PSBcIlwiKSByZXR1cm47XHJcbiAgaWRQZXJmaXggPSBwZXJmaXg7XHJcbiAgY29uc3QgcmVzID0gZmluZFN2Z0ZpbGUocGF0aCk7XHJcbiAgcmV0dXJuIHtcclxuICAgIG5hbWU6IFwic3ZnLXRyYW5zZm9ybVwiLFxyXG4gICAgdHJhbnNmb3JtSW5kZXhIdG1sKGh0bWwpIHtcclxuICAgICAgcmV0dXJuIGh0bWw/LnJlcGxhY2UoXHJcbiAgICAgICAgXCI8Ym9keT5cIixcclxuICAgICAgICBgXHJcbiAgICAgICAgICA8Ym9keT5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAwOyBoZWlnaHQ6IDBcIj5cclxuICAgICAgICAgICAgICAke3Jlcy5qb2luKFwiXCIpfVxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICBgXHJcbiAgICAgICk7XHJcbiAgICB9LFxyXG4gIH07XHJcbn07XHJcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRTpcXFxcXHU2NzgxXHU1MTQ5XHU2NUZCXFxcXGltX2JhY2tzdGFnZVxcXFxzcmNcXFxcdXRpbHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFx1Njc4MVx1NTE0OVx1NjVGQlxcXFxpbV9iYWNrc3RhZ2VcXFxcc3JjXFxcXHV0aWxzXFxcXHRvb2xzLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi8lRTYlOUUlODElRTUlODUlODklRTYlOTclQkIvaW1fYmFja3N0YWdlL3NyYy91dGlscy90b29scy50c1wiO2ltcG9ydCB0eXBlIHsgSWhhbmRsZXIsIEV4dGVuZGVkRG9jdW1lbnQgfSBmcm9tIFwiQC90eXBlcy91dGlscy9kb21cIjtcclxuZXhwb3J0IGNvbnN0IGNoZWNrRnVsbCA9ICgpID0+IHtcclxuICBjb25zdCBodG1sRG9jdW1lbnQ6IEV4dGVuZGVkRG9jdW1lbnQgPSBkb2N1bWVudDtcclxuICBjb25zdCBpc0Z1bGwgPVxyXG4gICAgaHRtbERvY3VtZW50Lm1vekZ1bGxTY3JlZW4gfHxcclxuICAgIGh0bWxEb2N1bWVudC5mdWxsU2NyZWVuIHx8XHJcbiAgICBodG1sRG9jdW1lbnQud2Via2l0SXNGdWxsU2NyZWVuIHx8XHJcbiAgICBodG1sRG9jdW1lbnQud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4gfHxcclxuICAgIGh0bWxEb2N1bWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbiB8fFxyXG4gICAgaHRtbERvY3VtZW50Lm1zRnVsbHNjcmVlbkVuYWJsZWQ7XHJcbiAgcmV0dXJuICEhaXNGdWxsO1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIFdpbmRvd1Jlc2l6ZUNoYW5nZSB7XHJcbiAgcHJpdmF0ZSByZXNpemVUaHJvdHRsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGRlbGF5OiBudW1iZXI7XHJcbiAgcHVibGljIGNhbGxiYWNrOiBhbnkgPSAoKSA9PiB7fTtcclxuICBjb25zdHJ1Y3RvcihoYW5kbGVyOiBJaGFuZGxlciwgZGVsYXkgPSAyNTApIHtcclxuICAgIHRoaXMuZGVsYXkgPSBkZWxheTtcclxuICAgIC8vIFx1NTE5OVx1NkNENTFcclxuICAgIC8qY29uc3QgeyBoYW5kbGVSZXNpemUgfSA9IHRoaXM7XHJcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBoYW5kbGVSZXNpemUuYmluZCh0aGlzLCBoYW5kbGVyKTtcclxuICAgIGZ1bmN0aW9uTmFtZSgpOyovXHJcbiAgICAvLyBcdTUxOTlcdTZDRDUyXHJcbiAgICB0aGlzLmhhbmRsZVJlc2l6ZShoYW5kbGVyKTtcclxuICB9XHJcbiAgY2hlY2tJc01vYmlsZSgpIHtcclxuICAgIGNvbnN0IGNsaWVudFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICByZXR1cm4gY2xpZW50V2lkdGggPD0gNzUwO1xyXG4gIH1cclxuICByZXNpemVMaXN0ZW5lcihoYW5kbGVyOiBJaGFuZGxlcikge1xyXG4gICAgbGV0IHsgZGVsYXksIGNoZWNrSXNNb2JpbGUgfSA9IHRoaXM7XHJcbiAgICBpZiAoIXRoaXMucmVzaXplVGhyb3R0bGVkKSB7XHJcbiAgICAgIHRoaXMucmVzaXplVGhyb3R0bGVkID0gdHJ1ZTtcclxuICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBoYW5kbGVyKGNoZWNrSXNNb2JpbGUoKSk7XHJcbiAgICAgICAgdGhpcy5yZXNpemVUaHJvdHRsZWQgPSBmYWxzZTtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xyXG4gICAgICB9LCBkZWxheSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGhhbmRsZVJlc2l6ZShoYW5kbGVyOiBJaGFuZGxlcikge1xyXG4gICAgY29uc3QgeyByZXNpemVMaXN0ZW5lciB9ID0gdGhpcztcclxuICAgIHRoaXMuY2FsbGJhY2sgPSByZXNpemVMaXN0ZW5lci5iaW5kKHRoaXMsIGhhbmRsZXIpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5jYWxsYmFjaywgZmFsc2UpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpbGVTaXplKHNpemU6IG51bWJlciwgcG9pbnRMZW5ndGggPSAyKSB7XHJcbiAgaWYgKHNpemUgPCAxMDI0KSB7XHJcbiAgICByZXR1cm4gc2l6ZSArIFwiQlwiO1xyXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDEwMjQgKiAxMDI0KSB7XHJcbiAgICByZXR1cm4gKHNpemUgLyAxMDI0KS50b0ZpeGVkKHBvaW50TGVuZ3RoKSArIFwiS0JcIjtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIChzaXplIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQocG9pbnRMZW5ndGgpICsgXCJNQlwiO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZpbGVMb2NhbFVybCA9IChmaWxlOiBGaWxlKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChlOiBhbnkpIHtcclxuICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xyXG4gICAgfTtcclxuICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24gKGU6IGFueSkge1xyXG4gICAgICByZWplY3QoZSk7XHJcbiAgICB9O1xyXG4gIH0pO1xyXG59O1xyXG5leHBvcnQgY29uc3QgZ2V0RmlsZU5hbWUgPSAodXJsOiBzdHJpbmcpID0+IHtcclxuICBjb25zdCBhcnIgPSB1cmwuc3BsaXQoXCIvXCIpO1xyXG4gIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xyXG59O1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFx1Njc4MVx1NTE0OVx1NjVGQlxcXFxpbV9iYWNrc3RhZ2VcXFxcc3JjXFxcXHBsdWdpbnNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFx1Njc4MVx1NTE0OVx1NjVGQlxcXFxpbV9iYWNrc3RhZ2VcXFxcc3JjXFxcXHBsdWdpbnNcXFxcdGluaWZ5SW1nLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi8lRTYlOUUlODElRTUlODUlODklRTYlOTclQkIvaW1fYmFja3N0YWdlL3NyYy9wbHVnaW5zL3RpbmlmeUltZy50c1wiO2ltcG9ydCB7IGZvcm1hdEZpbGVTaXplIGFzIGZvcm1hdFNpemUgfSBmcm9tIFwiLi4vdXRpbHMvdG9vbHNcIjtcclxuaW1wb3J0IHsgcmVhZEZpbGUsIHN0YXQgfSBmcm9tIFwiZnNcIjtcclxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcclxuaW1wb3J0IHNoYXJwIGZyb20gXCJzaGFycFwiO1xyXG50eXBlIEltZ1R5cGUgPSBcInBuZ1wiIHwgXCJqcGVnXCIgfCBcImdpZlwiIHwgXCJ3ZWJwXCI7XHJcbmludGVyZmFjZSBJbWdGaWxlIHtcclxuICBzaXplOiBzdHJpbmc7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbn1cclxubGV0IGhhc2hDb25uZWN0ID0gXCItXCI7XHJcbmxldCBoYXNoTGVuZ3RoID0gODtcclxubGV0IGlzTmVlZEhhc2ggPSB0cnVlO1xyXG5sZXQgYXNzZXRzSW5saW5lTGltaXQgPSA0MDk2O1xyXG5jb25zdCBpbWdGaWxlTWFwOiB7XHJcbiAgW2tleTogc3RyaW5nXTogSW1nRmlsZTtcclxufSA9IHt9O1xyXG5jb25zdCBpbWFnZVJlZ2V4ID0gL1xcLihwbmd8anBlP2d8Z2lmfHdlYnApJC9pO1xyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVIYXNoKGNvbnRlbnQ6IHN0cmluZyB8IEJ1ZmZlcikge1xyXG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoXCJoZXhcIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEZpbGVFeHQoZmlsZVBhdGg6IHN0cmluZykge1xyXG4gIHJldHVybiBmaWxlUGF0aC5zcGxpdChcIi5cIikucG9wKCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEZpbGVOYW1lKGZpbGVQYXRoOiBzdHJpbmcpIHtcclxuICByZXR1cm4gZmlsZVBhdGguc3BsaXQoXCIvXCIpLnBvcCgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZUhhc2hGaWxlTmFtZShcclxuICBmaWxlUGF0aDogc3RyaW5nLFxyXG4gIGlzQ29ubmVjdEhhc2g6IGJvb2xlYW4sXHJcbiAgaGFzaExlbjogbnVtYmVyLFxyXG4gIGhhc2g6IHN0cmluZ1xyXG4pIHtcclxuICBjb25zdCBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKGZpbGVQYXRoKSBhcyBzdHJpbmc7XHJcbiAgY29uc3QgZXh0ID0gZ2V0RmlsZUV4dChmaWxlTmFtZSk7XHJcbiAgcmV0dXJuIGlzQ29ubmVjdEhhc2hcclxuICAgID8gYCR7ZmlsZU5hbWUucmVwbGFjZShgLiR7ZXh0fWAsIFwiXCIpfSR7aGFzaENvbm5lY3R9JHtoYXNoLnNsaWNlKFxyXG4gICAgICAgIDAsXHJcbiAgICAgICAgaGFzaExlblxyXG4gICAgICApfS4ke2V4dH1gXHJcbiAgICA6IGAke2ZpbGVOYW1lLnJlcGxhY2UoYC4ke2V4dH1gLCBcIlwiKX0uJHtleHR9YDtcclxufVxyXG5mdW5jdGlvbiBnZXRGaWxlU2l6ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB2b2lkPiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICBzdGF0KGZpbGVQYXRoLCAoZXJyLCBzdGF0cykgPT4ge1xyXG4gICAgICBpZiAoZXJyKSByZXNvbHZlKHZvaWQgMCk7XHJcbiAgICAgIHJlc29sdmUoc3RhdHMuc2l6ZSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZEZpbGVDb250ZW50KGZpbGVQYXRoOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgIHJlYWRGaWxlKGZpbGVQYXRoLCAoZXJyLCBkYXRhKSA9PiB7XHJcbiAgICAgIGlmIChlcnIpIHJlc29sdmUodm9pZCAwKTtcclxuICAgICAgcmVzb2x2ZShkYXRhKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBmb3JtYXR0ZXJMb2coZmlsZVBhdGg6IHN0cmluZywgc2l6ZUJlZm9yZTogc3RyaW5nLCBzaXplQWZ0ZXI6IHN0cmluZykge1xyXG4gIGNvbnNvbGUubG9nKFxyXG4gICAgXCJcXG5cXHgxQlszNG1cIixcclxuICAgIGBcdTMwMTAke2ZpbGVQYXRofVx1MzAxMVx1NTM4Qlx1N0YyOVx1NjIxMFx1NTI5RmAsXHJcbiAgICBcIlxceDFCWzBtXCIsXHJcbiAgICBcIlxceDFCWzMxbVwiLFxyXG4gICAgc2l6ZUJlZm9yZSxcclxuICAgIFwiXFx4MUJbMG1cIixcclxuICAgIFwiPT09PlwiLFxyXG4gICAgXCJcXHgxQlszMm1cIixcclxuICAgIHNpemVBZnRlcixcclxuICAgIFwiXFx4MUJbMG1cIlxyXG4gICk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRpbmlmeUltZyhpbWdGaWxlOiBJbWdGaWxlKTogYW55IHtcclxuICBjb25zdCB7IHNpemUsIHVybDogZmlsZVBhdGggfSA9IGltZ0ZpbGU7XHJcbiAgY29uc3QgZXh0OiBJbWdUeXBlID0gZ2V0RmlsZUV4dChmaWxlUGF0aCkgYXMgSW1nVHlwZTtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgIHN3aXRjaCAoZXh0KSB7XHJcbiAgICAgIGNhc2UgXCJwbmdcIjpcclxuICAgICAgICBzaGFycChmaWxlUGF0aCwgeyBsaW1pdElucHV0UGl4ZWxzOiBmYWxzZSB9KVxyXG4gICAgICAgICAgLnBuZyh7IHF1YWxpdHk6IDEwIH0pXHJcbiAgICAgICAgICAudG9CdWZmZXIoKGVyciwgZGF0YSwgaW5mbykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYFxcblxceDFCWzMxbVx1MzAxMCR7ZmlsZVBhdGh9XHUzMDExXHU1MzhCXHU3RjI5XHU1OTMxXHU4RDI1XFx4MUJbMG1gLCBlcnIpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodm9pZCAwKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBmb3JtYXR0ZXJMb2coZmlsZVBhdGgsIHNpemUsIGZvcm1hdFNpemUoaW5mby5zaXplKSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJqcGVnXCI6XHJcbiAgICAgICAgc2hhcnAoZmlsZVBhdGgsIHsgbGltaXRJbnB1dFBpeGVsczogZmFsc2UgfSlcclxuICAgICAgICAgIC5qcGVnKHsgcXVhbGl0eTogMTAgfSlcclxuICAgICAgICAgIC50b0J1ZmZlcigoZXJyLCBkYXRhLCBpbmZvKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgXFxuXFx4MUJbMzFtXHUzMDEwJHtmaWxlUGF0aH1cdTMwMTFcdTUzOEJcdTdGMjlcdTU5MzFcdThEMjVcXHgxQlswbWAsIGVycik7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh2b2lkIDApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGZvcm1hdHRlckxvZyhmaWxlUGF0aCwgc2l6ZSwgZm9ybWF0U2l6ZShpbmZvLnNpemUpKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImdpZlwiOlxyXG4gICAgICAgIHNoYXJwKGZpbGVQYXRoLCB7IGFuaW1hdGVkOiB0cnVlLCBsaW1pdElucHV0UGl4ZWxzOiBmYWxzZSB9KVxyXG4gICAgICAgICAgLmdpZih7IGludGVyRnJhbWVNYXhFcnJvcjogMTAsIGNvbG91cnM6IDIwMCB9KVxyXG4gICAgICAgICAgLnRvQnVmZmVyKChlcnIsIGRhdGEsIGluZm8pID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBcXG5cXHgxQlszMW1cdTMwMTAke2ZpbGVQYXRofVx1MzAxMVx1NTM4Qlx1N0YyOVx1NTkzMVx1OEQyNVxceDFCWzBtYCwgZXJyKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHZvaWQgMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZm9ybWF0dGVyTG9nKGZpbGVQYXRoLCBzaXplLCBmb3JtYXRTaXplKGluZm8uc2l6ZSkpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwid2VicFwiOlxyXG4gICAgICAgIHNoYXJwKGZpbGVQYXRoLCB7IGxpbWl0SW5wdXRQaXhlbHM6IGZhbHNlIH0pXHJcbiAgICAgICAgICAud2VicCh7IHF1YWxpdHk6IDEwIH0pXHJcbiAgICAgICAgICAudG9CdWZmZXIoKGVyciwgZGF0YSwgaW5mbykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYFxcblxceDFCWzMxbVx1MzAxMCR7ZmlsZVBhdGh9XHUzMDExXHU1MzhCXHU3RjI5XHU1OTMxXHU4RDI1XFx4MUJbMG1gLCBlcnIpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodm9pZCAwKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBmb3JtYXR0ZXJMb2coZmlsZVBhdGgsIHNpemUsIGZvcm1hdFNpemUoaW5mby5zaXplKSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmVzb2x2ZSh2b2lkIDApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbmV4cG9ydCBkZWZhdWx0ICgpID0+IHtcclxuICByZXR1cm4ge1xyXG4gICAgbmFtZTogXCJ2aXRlLXBsdWdpbi10aW5pZnktaW1hZ2VcIixcclxuICAgIGVuZm9yY2U6IFwicHJlXCIsIC8vIFx1NTcyOFx1NTE3Nlx1NEVENlx1NjNEMlx1NEVGNlx1NTkwNFx1NzQwNlx1NEU0Qlx1NTI0RFx1RkYwQ1x1NTE0OFx1NTkwNFx1NzQwNlxyXG4gICAgYXBwbHk6IFwiYnVpbGRcIiwgLy8gXHU1M0VBXHU1NzI4XHU3NTFGXHU0RUE3XHU3M0FGXHU1ODgzXHU2Nzg0XHU1RUZBXHU2NUY2XHU1NDJGXHU3NTI4XHJcbiAgICBhc3luYyBjb25maWdSZXNvbHZlZChjb25maWc6IGFueSkge1xyXG4gICAgICBhc3NldHNJbmxpbmVMaW1pdCA9IGNvbmZpZy5idWlsZC5hc3NldHNJbmxpbmVMaW1pdDtcclxuICAgICAgY29uc3QgYXNzZXRGaWxlTmFtZXMgPVxyXG4gICAgICAgIGNvbmZpZz8uYnVpbGQ/LnJvbGx1cE9wdGlvbnM/Lm91dHB1dD8uYXNzZXRGaWxlTmFtZXM7XHJcbiAgICAgIGlmIChhc3NldEZpbGVOYW1lcykge1xyXG4gICAgICAgIGlmICgvXFxbaGFzaDo/KFxcZCopXFxdLy50ZXN0KGFzc2V0RmlsZU5hbWVzKSkge1xyXG4gICAgICAgICAgaGFzaENvbm5lY3QgPSBcIlwiO1xyXG4gICAgICAgICAgYXNzZXRGaWxlTmFtZXMucmVwbGFjZShcclxuICAgICAgICAgICAgL1xcW25hbWVcXF0oLilcXFtoYXNoOj8oXFxkKilcXF0vLFxyXG4gICAgICAgICAgICAobWF0Y2g6IHN0cmluZywgJDE6IHN0cmluZywgJDI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIGhhc2hDb25uZWN0ID0gJDE7XHJcbiAgICAgICAgICAgICAgaGFzaExlbmd0aCA9IE51bWJlcigkMikgfHwgODtcclxuICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaXNOZWVkSGFzaCA9IGZhbHNlO1xyXG4gICAgICAgICAgaGFzaENvbm5lY3QgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBoYXNoQ29ubmVjdCA9IFwiLVwiO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgYXN5bmMgbG9hZChpZDogc3RyaW5nKSB7XHJcbiAgICAgIGlmIChpbWFnZVJlZ2V4LnRlc3QoaWQpKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGF3YWl0IGdldEZpbGVTaXplKGlkKTtcclxuICAgICAgICBpZiAoc2l6ZSAmJiBzaXplID4gYXNzZXRzSW5saW5lTGltaXQpIHtcclxuICAgICAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgcmVhZEZpbGVDb250ZW50KGlkKTtcclxuICAgICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgICAgaW1nRmlsZU1hcFtcclxuICAgICAgICAgICAgICBnZW5lcmF0ZUhhc2hGaWxlTmFtZShcclxuICAgICAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICAgICAgaXNOZWVkSGFzaCxcclxuICAgICAgICAgICAgICAgIGhhc2hMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUhhc2gocmVzKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgXSA9IHtcclxuICAgICAgICAgICAgICBzaXplOiBmb3JtYXRTaXplKHNpemUpLFxyXG4gICAgICAgICAgICAgIHVybDogaWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgYXN5bmMgZ2VuZXJhdGVCdW5kbGUoX29wdGlvbnM6IGFueSwgYnVuZGxlOiBhbnkpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJcXG49PT09PT09PT09PT09PT1cdTVGMDBcdTU5Q0JcdTU2RkVcdTcyNDdcdTUzOEJcdTdGMjk9PT09PT09PT09PT09PVwiKTtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gYnVuZGxlKSB7XHJcbiAgICAgICAgaWYgKGltYWdlUmVnZXgudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKGtleSk7XHJcbiAgICAgICAgICBpZiAoZmlsZU5hbWUgJiYgaW1nRmlsZU1hcFtmaWxlTmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGluaWZ5SW1nKGltZ0ZpbGVNYXBbZmlsZU5hbWVdKTtcclxuICAgICAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgICAgIGJ1bmRsZVtrZXldLnNvdXJjZSA9IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZyhcIlxcbj09PT09PT09PT09PT09PVx1NUI4Q1x1NjIxMFx1NTZGRVx1NzI0N1x1NTM4Qlx1N0YyOT09PT09PT09PT09PT09XCIpO1xyXG4gICAgfSxcclxuICB9O1xyXG59O1xyXG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIkU6XFxcXFx1Njc4MVx1NTE0OVx1NjVGQlxcXFxpbV9iYWNrc3RhZ2VcXFxcc3JjXFxcXGNvbmZpZ1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRTpcXFxcXHU2NzgxXHU1MTQ5XHU2NUZCXFxcXGltX2JhY2tzdGFnZVxcXFxzcmNcXFxcY29uZmlnXFxcXHN5c3RlbS50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovJUU2JTlFJTgxJUU1JTg1JTg5JUU2JTk3JUJCL2ltX2JhY2tzdGFnZS9zcmMvY29uZmlnL3N5c3RlbS50c1wiO2V4cG9ydCBjb25zdCBnZXROb3dEYXRlID0gKCkgPT4ge1xyXG4gIHZhciBkYXRlOiBhbnkgPSBuZXcgRGF0ZSgpO1xyXG4gIHZhciBzaWduMjogYW55ID0gXCI6XCI7XHJcbiAgdmFyIHllYXI6IGFueSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsgLy8gXHU1RTc0XHJcbiAgdmFyIG1vbnRoOiBhbnkgPSBkYXRlLmdldE1vbnRoKCkgKyAxOyAvLyBcdTY3MDhcclxuICB2YXIgZGF5OiBhbnkgPSBkYXRlLmdldERhdGUoKTsgLy8gXHU2NUU1XHJcbiAgdmFyIGhvdXI6IGFueSA9IGRhdGUuZ2V0SG91cnMoKTsgLy8gXHU2NUY2XHJcbiAgdmFyIG1pbnV0ZXM6IGFueSA9IGRhdGUuZ2V0TWludXRlcygpOyAvLyBcdTUyMDZcclxuICB2YXIgc2Vjb25kczogYW55ID0gZGF0ZS5nZXRTZWNvbmRzKCk7IC8vXHU3OUQyXHJcbiAgdmFyIHdlZWtBcnI6IGFueSA9IFtcclxuICAgIFwiXHU2NjFGXHU2NzFGXHU1OTI5XCIsXHJcbiAgICBcIlx1NjYxRlx1NjcxRlx1NEUwMFwiLFxyXG4gICAgXCJcdTY2MUZcdTY3MUZcdTRFOENcIixcclxuICAgIFwiXHU2NjFGXHU2NzFGXHU0RTA5XCIsXHJcbiAgICBcIlx1NjYxRlx1NjcxRlx1NTZEQlwiLFxyXG4gICAgXCJcdTY2MUZcdTY3MUZcdTRFOTRcIixcclxuICAgIFwiXHU2NjFGXHU2NzFGXHU1MTZEXCIsXHJcbiAgXTtcclxuICB2YXIgd2VlazogYW55ID0gd2Vla0FycltkYXRlLmdldERheSgpXTtcclxuICAvLyBcdTdFRDlcdTRFMDBcdTRGNERcdTY1NzBcdTc2ODRcdTY1NzBcdTYzNkVcdTUyNERcdTk3NjJcdTUyQTAgXHUyMDFDMFx1MjAxRFxyXG4gIGlmIChtb250aCA+PSAxICYmIG1vbnRoIDw9IDkpIG1vbnRoID0gXCIwXCIgKyBtb250aDtcclxuICBpZiAoZGF5ID49IDAgJiYgZGF5IDw9IDkpIGRheSA9IFwiMFwiICsgZGF5O1xyXG4gIGlmIChob3VyID49IDAgJiYgaG91ciA8PSA5KSBob3VyID0gXCIwXCIgKyBob3VyO1xyXG4gIGlmIChtaW51dGVzID49IDAgJiYgbWludXRlcyA8PSA5KSBtaW51dGVzID0gXCIwXCIgKyBtaW51dGVzO1xyXG4gIGlmIChzZWNvbmRzID49IDAgJiYgc2Vjb25kcyA8PSA5KSBzZWNvbmRzID0gXCIwXCIgKyBzZWNvbmRzO1xyXG4gIHJldHVybiAoXHJcbiAgICB5ZWFyICtcclxuICAgIFwiLVwiICtcclxuICAgIG1vbnRoICtcclxuICAgIFwiLVwiICtcclxuICAgIGRheSArXHJcbiAgICBcIiBcIiArXHJcbiAgICBob3VyICtcclxuICAgIHNpZ24yICtcclxuICAgIG1pbnV0ZXMgK1xyXG4gICAgc2lnbjIgK1xyXG4gICAgc2Vjb25kcyArXHJcbiAgICBcIiBcIiArXHJcbiAgICB3ZWVrXHJcbiAgKTtcclxufTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUF5USxTQUFTLGNBQWMsZUFBZTtBQUMvUyxPQUFPLFNBQVM7QUFDaEIsU0FBUyxlQUFlO0FBQ3hCLE9BQU8sb0JBQW9CO0FBQzNCLE9BQU8sWUFBWTtBQUNuQixPQUFPLGdCQUFnQjtBQUN2QixPQUFPLGdCQUFnQjtBQUN2QixTQUFTLDRCQUE0QjtBQUNyQyxPQUFPLGFBQWE7QUFDcEIsT0FBTyxlQUFlOzs7QUNUeVIsU0FBUyxjQUFjLG1CQUFtQjtBQUV6VixJQUFJLFdBQVc7QUFDZixJQUFNLFdBQVc7QUFDakIsSUFBTSxtQkFBbUI7QUFFekIsSUFBTSxhQUFhO0FBRW5CLElBQU0sY0FBYztBQUVwQixTQUFTLFlBQVks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
